package h_eekwan.basic;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class J18_JDBCsetup {
	
	// JDBC 접속 정보
	private static final String DRV = "oracle.jdbc.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@//localhost:1521/xe"; // 오라클은 1521,mysql은 3306 포트
	private static final String USR = "scott";
	private static final String PWD = "TIGER";
	// SQL 문 작성
	private static final String insertSQL = 
			" insert into sungjuk(sjno, name, kor, eng, mat) " +
			" VALUES (SJNO.nextval, '혜교', 78, 45, 12) ";
	private static final String selectSQL = 
			"select * from sungjuk order by sjno desc";
	
	public static void main(String[] args) {
		// 오라클을 이용한 JDBC 프로그래밍 기초
		// 1. JDBC 드라이버를 메모리에 적재
		// 객체로 생성하고 이것을 DriverManager에 등록
		
		// 2. DriverManager의 getConnection 메서드
		// 이용해서 데이터베이스 연결객체를 생성함
		
		// 3.PreparedStatement로 실행할 SQL문 객체를 생성
		// 4. 실행하는 SQL문이 insert, update, delete라면
		//	executeUpdate()를 사용하고
		//	실행결과는 int로 받음
		
		// 4.실행하는 SQL문이 select라면 
		//	executeQuery()를 사용하고,
		//	실행결과는 ResultSet으로 받음
		
		// 5.	ResultSet으로 받은 결과는
		//		먼저 rs.next()로 읽어올 레코드(행)를 가리킨다
		//		rs.getXXX ( 필드번호 ) 또는
		//		rs.getXXX ( 필드이름 ) 으로
		//		테이블의 각 필드 값을 처리할 수 있음
		
		// 6.	JDBC 작업이 끝나면
		//		데이터베이스 접속을 끊고
		//		관련객체 (conn, ps, rs) 는
		//		메모리에서 제거함
		
		//기계적으로 작성해라. 무조건 작성 <외우기>
		Connection conn = null; 		// 2-2 연결객체 저장용
		PreparedStatement ps = null;	// 3-1 SQL 객체
		ResultSet rs = null; 			// 3-2 실행결과 저장용
		
		
		try{
			Class.forName(DRV);	 // 1.
			conn = DriverManager.getConnection(URL, USR, PWD); // 2-1. 얘를 'conn'이라는 연결객체에 담기 (아이디,비번
			
			ps = conn.prepareStatement( insertSQL );		//마지막.실행할 SQL문 main 밖에서 만들기
			int cnt = ps.executeUpdate(); // 4.				insert, update,delete라면 int로 받아야함 
			System.out.println( cnt + "건의 데이터 입력");	// insert문을 한번실행햇으니 1건이나옴
			
			ps.close(); 		// 또다른 SQL문 작성하기 위해
								// 기존 ps 객체 제거
			
			ps = conn.prepareStatement( selectSQL );
			rs = ps.executeQuery();		// select라서 resultset으로 실행결과 받음
			
			// ResultSet에서 결과를 레코드 단위로 꺼내
			// 차레대로 출력
			while(rs.next()){	// 5.
					// ResultSet에서 읽어올 레코드가 있으면
				System.out.println( rs.getInt(1));	// 필드순서. 1은 sjno, 2는 name 필드순서모르면 아래처럼 필드명	
													// 데이터 유형에따라. 해당필드가 문자면 getString, 숫자면 getInt
				System.out.println( rs.getString("name")); 	// 유형이 뭔지 모를경우 getStirng
			} // while
			
		} catch (Exception ex) {
			ex.printStackTrace();			
		} finally {
			// 6.
			// JDBC 작업이 끝난후 메모리에서 객체 제거
			if (rs != null)	// re가 사용중이라면 re를 클로즈시켜줘라
				try {
					rs.close();
				} catch (SQLException e) {	//오류가생기면 밑에께 실행되지않기때문에 try-catch로 묶어줬음
					e.printStackTrace();
				}
			if (ps != null)
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			if (conn != null)
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}
		
		
	}	//main
	
	
}	//class
